#include "../include/type.h"
#include "../include/const.h"
#include "../include/protect.h"

PUBLIC  void* memcpy(void* pDst, void* pSrc, int iSize);

PUBLIC  void disp_str(char * pszInfo);

PUBLIC  u8  gdt_ptr[6]; /* 0~15:Limit  16~47:Base */
PUBLIC  DESCRIPTOR  gdt[GDT_SIZE];

PUBLIC void cstart()
{

    disp_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
         "-----\"cstart\" begins-----\n");

    /* 将 LOADER 中的 GDT 复制到新的 GDT 中 */
    memcpy(&gdt,                        /* New GDT */
           (void*)(*((u32*)(&gdt_ptr[2]))),     /* Base of old GDT */
           *((u16*)(&gdt_ptr[0])) + 1       /* Limit of old GDT */
        );
    /* gdt_ptr[6]共6个字节：0~15:Limit、16~47:Base。用作sgdt/lgdt的参数。*/
    /* 下面的代码重新设置gdt_ptr中的内容(base&limit)，使其指向新的GDT */
    u16* p_gdt_limit = (u16*)(&gdt_ptr[0]);
    u32* p_gdt_base = (u32*)(&gdt_ptr[2]);
    *p_gdt_limit = GDT_SIZE * sizeof(DESCRIPTOR) - 1;
    *p_gdt_base = (u32)&gdt;
}
